import Vue from 'vue'
import App from './App.vue'
import axios from 'axios'
import 'vant/lib/index.css'
import { Toast } from 'vant'
// 导入样式文件
import 'animate.css/animate.min.css'
// 导入v-md-edit 插件
import VMdEditor from '@kangc/v-md-editor'
// 导入v-md-edit 插件样式
import '@kangc/v-md-editor/lib/style/base-editor.css'
// 导入代码高亮模式，为github模式
import githubTheme from '@kangc/v-md-editor/lib/theme/github.js'
// 导入代码高亮样式
import '@kangc/v-md-editor/lib/theme/style/github.css'
// 导入highlightjs
import hljs from 'highlight.js'
// 预览md文档的组件
import VMdPreview from '@kangc/v-md-editor/lib/preview'
import '@kangc/v-md-editor/lib/style/preview.css'

import createLineNumbertPlugin from '@kangc/v-md-editor/lib/plugins/line-number/index'
// 代码行号插件
import createHighlightLinesPlugin from '@kangc/v-md-editor/lib/plugins/highlight-lines/index'
// 代码快捷复制
// import createCopyCodePlugin from '@kangc/v-md-editor/lib/plugins/copy-code/index'

// 默认写文件夹 会读取文件夹内 名称是index.js的文件 会自动导入 所以可以直接写文件夹
import router from '@/router'
// 配置默认IP地址
// axios.defaults.baseURL = 'http://localhost:9000/api/'
// 设置超时时间
// axios.defaults.timeout = 10000
// 设置统一的请求头
// axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8'
// 把axios配置成Vue对象的属性 在任意组件当中 都可以使用 this.$http的方式使用
// Vue.prototype.$http = axios
// 是否开启生产打包提示
Vue.config.productionTip = false
Vue.prototype.imageUrl = 'http://localhost:9000'

// 在v-md-edit组件中注册
VMdEditor.use(createLineNumbertPlugin())
// VMdEditor.use(createCopyCodePlugin())
VMdEditor.use(createHighlightLinesPlugin())
// 全局使用 v-md-edit 插件
Vue.use(VMdEditor)
// 配置v-md-edit插件的代码高亮为github模式，使用highlight.js
VMdEditor.use(githubTheme, {
  Hljs: hljs
})
// 预览组件
Vue.use(VMdPreview)

// 响应拦截器
axios.interceptors.response.use(
  response => {
    // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
    // 否则的话抛出错误
    if (response.status === 200) {
      return Promise.resolve(response)
    } else {
      return Promise.reject(response)
    }
  },
  // 服务器状态码不是2开头的的情况
  // 这里可以跟你们的后台开发人员协商好统一的错误状态码
  // 然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等
  // 下面列举几个常见的操作，其他需求可自行扩展
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        // 未登录则跳转登录页面，并携带当前页面的路径
        // 在登录成功后返回当前页面，这一步需要在登录页操作。
        case 401:
          router.replace({
            path: '/login',
            query: {
              redirect: router.currentRoute.fullPath
            }
          })
          break

        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        case 403:
          Toast({
            message: '登录过期，请重新登录',
            duration: 1000,
            forbidClick: true
          })
          // 清除token
          localStorage.removeItem('my_token')
          // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
          setTimeout(() => {
            router.replace({
              path: '/login',
              query: {
                redirect: router.currentRoute.fullPath
              }
            })
          }, 1000)
          break

        // 404请求不存在
        case 404:
          Toast({
            message: '网络请求不存在',
            duration: 1500,
            forbidClick: true
          })
          break
        // 其他错误，直接抛出错误提示
        default:
          Toast({
            message: error.response.data.msg,
            duration: 1500,
            forbidClick: true
          })
      }
      return Promise.reject(error.response)
    }
  }
)

new Vue({
  render: h => h(App),
  router
}).$mount('#app')
